﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;

namespace MiraPark
{
    public partial class FormCadastroTabelaConvenio : Form
    {
        private string operacao = "";

        public FormCadastroTabelaConvenio()
        {
            InitializeComponent();

        }

        private void FormCadastroTabelaConvenio_Load(object sender, EventArgs e)
        {
            //Popular a lista de tabelaConvenios cadastrados
            this.dataGridViewTabelaConvenio.DataSource = ModelBO.getTabelaConvenios();
            this.comboBoxHorario.DataSource = ModelBO.getHorarios(TipoPeriodoVO.TipoPeriodo.Convenio);


            setupButtonsControls();
        }

        private void dataGridViewTabelaConvenio_SelectionChanged(object sender, EventArgs e)
        {
            setupButtonsControls();
        }

        private void buttonNovo_Click(object sender, EventArgs e)
        {
            this.operacao = "novo";

            this.dateTimePickerInicioVigencia.Value = DateTime.Today;
            this.dateTimePickerFimVigencia.Value = DateTime.Today;
            setupButtonsControls();
        }

        private void buttonCancelar_Click(object sender, EventArgs e)
        {
            this.operacao = "cancelar";
            setupButtonsControls();
        }

        private void buttonEditar_Click(object sender, EventArgs e)
        {
            this.operacao = "editar";
            setupButtonsControls();
        }

        private void buttonExcluir_Click(object sender, EventArgs e)
        {
            this.operacao = "excluir";

            List<TabelaConvenioVO> tabelaConvenioList = (List<TabelaConvenioVO>)this.dataGridViewTabelaConvenio.DataSource;
            TabelaConvenioVO tabelaConvenioVO = tabelaConvenioList[this.dataGridViewTabelaConvenio.CurrentRow.Index];
            DialogResult dr = MessageBox.Show(this, "Confirma a exclusão da tabela " + tabelaConvenioVO.tabelaConvenio, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                ModelBO.getTabelaConvenioXPeriodos(tabelaConvenioVO);
                ModelBO.delTabelaConvenioXPeriodos(tabelaConvenioVO.tabelaConvenioPVOs);
                
                ModelBO.delTabelaConvenio(tabelaConvenioVO);

                int nRow = this.dataGridViewTabelaConvenio.CurrentRow.Index;
                this.dataGridViewTabelaConvenio.DataSource = ModelBO.getTabelaConvenios();
                if (this.dataGridViewTabelaConvenio.Rows.Count > 0)
                {
                    dataGridViewTabelaConvenio.CurrentCell = dataGridViewTabelaConvenio.Rows[Math.Min(nRow, this.dataGridViewTabelaConvenio.Rows.Count - 1)].Cells[0];
                    dataGridViewTabelaConvenio.Rows[Math.Min(nRow, this.dataGridViewTabelaConvenio.Rows.Count - 1)].Selected = true;
                }

                setupButtonsControls();
            }
        }

        private void buttonSalvar_Click(object sender, EventArgs e)
        {
            String erros = "";
            if (this.textBoxTabelaConvenio.Text.Trim().Length == 0)
                erros = erros + "Controle deve ser informado.\r\n";
            if (this.comboBoxHorario.SelectedItem==null)
                erros = erros + "Controle de horário deve ser informado.\r\n";
            if (this.dateTimePickerInicioVigencia.Value > this.dateTimePickerFimVigencia.Value)
                erros = erros + "Vigência inicial MAIOR que vigência final. (Segunda)\r\n";
            if (erros.Length > 0)
            {
                MessageBox.Show(this, erros, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            TabelaConvenioVO tabelaConvenio = null;

            if (this.operacao.Equals("novo"))
            {
                tabelaConvenio = TabelaConvenioVO.CreateTabelaConvenioVO();

                tabelaConvenio.idHorario = int.Parse(this.comboBoxHorario.SelectedValue.ToString());
                tabelaConvenio.idTabelaConvenio = (int)ModelBO.newTabelaConvenio(tabelaConvenio);
            }
            if (this.operacao.Equals("editar"))
            {
                List<TabelaConvenioVO> tabelaConvenioList = (List<TabelaConvenioVO>)this.dataGridViewTabelaConvenio.DataSource;
                tabelaConvenio = tabelaConvenioList[this.dataGridViewTabelaConvenio.CurrentRow.Index];
            }

            tabelaConvenio.idHorario = int.Parse(this.comboBoxHorario.SelectedValue.ToString());
            tabelaConvenio.tabelaConvenio = this.textBoxTabelaConvenio.Text;
            tabelaConvenio.inicioVigencia = this.dateTimePickerInicioVigencia.Value;
            tabelaConvenio.fimVigencia = this.dateTimePickerFimVigencia.Value;
            tabelaConvenio.segunda = checkBoxSegunda.Checked;
            tabelaConvenio.terca = checkBoxTerca.Checked;
            tabelaConvenio.quarta = checkBoxQuarta.Checked;
            tabelaConvenio.quinta = checkBoxQuinta.Checked;
            tabelaConvenio.sexta = checkBoxSexta.Checked;
            tabelaConvenio.sabado = checkBoxSabado.Checked;
            tabelaConvenio.domingo = checkBoxDomingo.Checked;
            tabelaConvenio.feriados = checkBoxFeriado.Checked;
            tabelaConvenio.outrasDatas = checkBoxOutraDAta.Checked;
            tabelaConvenio.valorMensal = this.numericUpDownVlrMensal.Value;
            tabelaConvenio.valorMensalMinimo = this.numericUpDownVlrMensalMinimo.Value;
            tabelaConvenio.valorMaximo = this.numericUpDownVlrMaximo.Value;

            ModelBO.setTabelaConvenio(tabelaConvenio);

            //salvar periodos
            List<TabelaConvenioPVO> listaTabelaConvenioPVO = new List<TabelaConvenioPVO>();
            foreach (DataGridViewRow dgvRow in dataGridViewPeriodos.Rows)
            {
                int minutos = 0;
                decimal valorCliente = 0.0M;
                decimal valorConvenio = 0.0M;
                decimal valorConvenioAdicional = 0.0M;
                try { minutos = int.Parse(dgvRow.Cells["minutos"].Value.ToString()); } catch (Exception ex) { }
                try { valorCliente = decimal.Parse(dgvRow.Cells["valorCliente"].Value.ToString()); } catch (Exception ex) { }
                try { valorConvenio = decimal.Parse(dgvRow.Cells["valorConvenio"].Value.ToString()); } catch (Exception ex) { }
                try { valorConvenioAdicional = decimal.Parse(dgvRow.Cells["valorConvenioAdicional"].Value.ToString()); } catch (Exception ex) { }

                TabelaConvenioPVO tabelaConvenioPVO = TabelaConvenioPVO.CreateTabelaConvenioPVO();
                tabelaConvenioPVO.idTabelaConvenioP = (int)dgvRow.Cells["periodo"].Value;
                tabelaConvenioPVO.idTabelaConvenio = tabelaConvenio.idTabelaConvenio;
                tabelaConvenioPVO.minutos = minutos;
                tabelaConvenioPVO.valorCliente = valorCliente ;
                tabelaConvenioPVO.valorConvenio = valorConvenio;
                tabelaConvenioPVO.valorConvenioAdicional = valorConvenioAdicional;
                tabelaConvenioPVO.acumula = (bool)dgvRow.Cells["acumula"].Value;
                listaTabelaConvenioPVO.Add(tabelaConvenioPVO);
            }
            ModelBO.getTabelaConvenioXPeriodos(tabelaConvenio);
            ModelBO.delTabelaConvenioXPeriodos(tabelaConvenio.tabelaConvenioPVOs);
            ModelBO.newTabelaConvenioXPeriodos(listaTabelaConvenioPVO);


            this.operacao = "salvar";

            List<TabelaConvenioVO> listTabelaConvenioVOs = ModelBO.getTabelaConvenios();
            dataGridViewTabelaConvenio.DataSource = listTabelaConvenioVOs;
            int nRow = listTabelaConvenioVOs.FindIndex(a => a.idTabelaConvenio == tabelaConvenio.idTabelaConvenio);
            dataGridViewTabelaConvenio.CurrentCell = dataGridViewTabelaConvenio.Rows[nRow].Cells[0];
            dataGridViewTabelaConvenio.Rows[nRow].Selected = true;

            setupButtonsControls();
        }


        private void setupButtonsControls()
        {
            bool haRows = this.dataGridViewTabelaConvenio.Rows.Count > 0 && this.dataGridViewTabelaConvenio.CurrentRow!=null;
            bool novo = this.operacao.Equals("novo");
            bool edit = this.operacao.Equals("editar");
            bool canc = this.operacao.Equals("cancelar");

            this.buttonCancelar.Enabled = novo || edit;
            this.buttonNovo.Enabled = !novo && !edit;
            this.buttonEditar.Enabled = haRows && !novo && !edit;
            this.buttonExcluir.Enabled = haRows && !novo && !edit;
            this.buttonSalvar.Enabled = novo || edit;

            this.comboBoxHorario.Enabled = novo || edit;
            this.textBoxTabelaConvenio.Enabled = novo || edit;
            this.dateTimePickerInicioVigencia.Enabled = novo || edit;
            this.dateTimePickerFimVigencia.Enabled = novo || edit;
            this.checkBoxSegunda.Enabled = novo || edit;
            this.checkBoxTerca.Enabled = novo || edit;
            this.checkBoxQuarta.Enabled = novo || edit;
            this.checkBoxQuinta.Enabled = novo || edit;
            this.checkBoxSexta.Enabled = novo || edit;
            this.checkBoxSabado.Enabled = novo || edit;
            this.checkBoxDomingo.Enabled = novo || edit;
            this.checkBoxFeriado.Enabled = novo || edit;
            this.checkBoxOutraDAta.Enabled = novo || edit;
            this.numericUpDownVlrMensal.Enabled = novo || edit;
            this.numericUpDownVlrMensalMinimo.Enabled = novo || edit;
            this.numericUpDownVlrMaximo.Enabled = novo || edit;

            this.dataGridViewTabelaConvenio.Enabled = !novo && !edit;

            this.dataGridViewPeriodos.Enabled = novo || edit;
            this.dataGridViewPeriodos.ReadOnly = !novo && !edit;
            this.dataGridViewPeriodos.Columns[1].ReadOnly = true;
            this.buttonIncluirPeriodo.Enabled = novo || edit;

            if (!haRows || novo)
            {
                this.textBoxTabelaConvenio.Text = "";

                this.dataGridViewPeriodos.Rows.Clear();
            }
            else {
                List<TabelaConvenioVO> tabelaConvenioList = (List<TabelaConvenioVO>)this.dataGridViewTabelaConvenio.DataSource;
                TabelaConvenioVO tabelaConvenio = tabelaConvenioList[this.dataGridViewTabelaConvenio.CurrentRow.Index];
                this.textBoxID.Text = tabelaConvenio.idTabelaConvenio.ToString();
                this.comboBoxHorario.SelectedValue = tabelaConvenio.idHorario;
                this.textBoxTabelaConvenio.Text = tabelaConvenio.tabelaConvenio;
                this.dateTimePickerInicioVigencia.Value = tabelaConvenio.inicioVigencia;
                this.dateTimePickerFimVigencia.Value = tabelaConvenio.fimVigencia;
                this.checkBoxSegunda.Checked = tabelaConvenio.segunda;
                this.checkBoxTerca.Checked = tabelaConvenio.terca;
                this.checkBoxQuarta.Checked = tabelaConvenio.quarta;
                this.checkBoxQuinta.Checked = tabelaConvenio.quinta;
                this.checkBoxSexta.Checked = tabelaConvenio.sexta;
                this.checkBoxSabado.Checked = tabelaConvenio.sabado;
                this.checkBoxDomingo.Checked = tabelaConvenio.domingo;
                this.checkBoxFeriado.Checked = tabelaConvenio.feriados;
                this.checkBoxOutraDAta.Checked = tabelaConvenio.outrasDatas;
                this.numericUpDownVlrMensal.Value = tabelaConvenio.valorMensal;
                this.numericUpDownVlrMensalMinimo.Value = tabelaConvenio.valorMensalMinimo;
                this.numericUpDownVlrMaximo.Value = tabelaConvenio.valorMaximo;

                ModelBO.getTabelaConvenioXPeriodos(tabelaConvenio);
                this.dataGridViewPeriodos.Rows.Clear();
                foreach (TabelaConvenioPVO tabelaConvenioPVO in tabelaConvenio.tabelaConvenioPVOs)
                {
                    int nrow = this.dataGridViewPeriodos.Rows.Add();
                    DataGridViewRow dgvRow = dataGridViewPeriodos.Rows[nrow];
                    dgvRow.Cells["periodo"].Value = tabelaConvenioPVO.idTabelaConvenioP;
                    dgvRow.Cells["minutos"].Value = tabelaConvenioPVO.minutos;
                    dgvRow.Cells["valorConvenio"].Value = tabelaConvenioPVO.valorConvenio;
                    dgvRow.Cells["valorConvenioAdicional"].Value = tabelaConvenioPVO.valorConvenioAdicional;
                    dgvRow.Cells["valorCliente"].Value = tabelaConvenioPVO.valorCliente;
                    dgvRow.Cells["acumula"].Value = tabelaConvenioPVO.acumula;
                }
            }
            if (novo || edit){
                this.textBoxTabelaConvenio.Focus();
            }
        }

        private void buttonIncluirPeriodo_Click(object sender, EventArgs e)
        {
            int rownum = this.dataGridViewPeriodos.Rows.Add();
            DataGridViewRow dgvrow = dataGridViewPeriodos.Rows[rownum];
            dgvrow.Cells["periodo"].Value = rownum + 1;
            dgvrow.Cells["minutos"].Value = 0;
            dgvrow.Cells["valorConvenio"].Value = 0.00M;
            dgvrow.Cells["valorConvenioAdicional"].Value = 0.00M;
            dgvrow.Cells["valorCliente"].Value = 0.00M;
            dgvrow.Cells["acumula"].Value = false;
        }

        private void dataGridViewPeriodos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
            {
                if (this.dataGridViewPeriodos.Columns[e.ColumnIndex].Name.Equals("buttonExcluirPeriodo"))
                {
                    DialogResult dr = MessageBox.Show(this, "Confirma a exclusão do periodo " + (e.RowIndex+1), "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr.ToString().Equals("Yes"))
                    {
                        int rownum = 1;
                        dataGridViewPeriodos.Rows.RemoveAt(e.RowIndex);
                        foreach (DataGridViewRow dgvRow in dataGridViewPeriodos.Rows)
                        {
                            dgvRow.Cells["periodo"].Value = rownum++;
                        }
                    }
                }
            }
        }

        private void buttonListagem_Click(object sender, EventArgs e)
        {
            FormReportTabelaConvenio formx = new FormReportTabelaConvenio();
            formx.MdiParent = this.MdiParent;
            formx.Show();
        }

    }
}
